package com.meilai.project.util;

import com.meilai.project.util.entity.PointRange;

/**
 * @author 张驰
 * @date 2020/9/9 11:11
 */
public class DistanceUtil {
	private static final double PI = 3.14159265;    //老祖真理
	private static final double EARTH_RADIUS = 6378137;    //赤道半径
	private static final double RAD = Math.PI / 180.0;

	public static PointRange getAroundRange(double lat, double lon, int radius) {
		double[] around = getAround(lat, lon, radius);
		return new PointRange(around[0], around[1], around[2], around[3]);
	}

	/**
	 * 经纬度范围
	 *
	 * @param lat
	 * @param lon
	 * @param raidus 单位米
	 * @return minLat, minLng, maxLat, maxLng
	 */
	public static double[] getAround(double lat, double lon, int raidus) {

		Double latitude = lat;
		Double longitude = lon;

		Double degree = (24901 * 1609) / 360.0;
		double raidusMile = raidus;

		Double dpmLat = 1 / degree;
		Double radiusLat = dpmLat * raidusMile;
		Double minLat = latitude - radiusLat;
		Double maxLat = latitude + radiusLat;

		Double mpdLng = degree * Math.cos(latitude * (PI / 180));
		Double dpmLng = 1 / mpdLng;
		Double radiusLng = dpmLng * raidusMile;
		Double minLng = longitude - radiusLng;
		Double maxLng = longitude + radiusLng;
		return new double[]{minLat, minLng, maxLat, maxLng};
	}

	/**
	 * 根据两点间经纬度坐标（double值），计算两点间距离，单位为米
	 *
	 * @param lng1
	 * @param lat1
	 * @param lng2
	 * @param lat2
	 * @return
	 */
	public static double getDistance(double lng1, double lat1, double lng2, double lat2) {
		double radLat1 = lat1 * RAD;
		double radLat2 = lat2 * RAD;
		double a = radLat1 - radLat2;
		double b = (lng1 - lng2) * RAD;
		double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
				Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS;
		s = Math.round(s * 10000) / 10000;
		return s;
	}
}
